﻿using System.Threading.Channels;

namespace Acl.Messages;

/// <summary>
/// 订阅选项
/// </summary>
public readonly record struct DistributionSubscribeOptions
{
    /// <summary>
    /// 消息主题
    /// </summary>
    public string Topic { get; init; }
    /// <summary>
    /// 如果指定，订阅服务器将加入此队列组。
    /// </summary>
    /// <remarks>
    /// 具有相同队列组名称的订阅服务器将成为一个队列组，
    /// 并且队列组中只有一个随机选择的订户将每次队列组接收到消息时都使用一条消息。
    /// </remarks>
    public string? QueueGroup { get; init; }

    /// <summary>
    /// 在自动取消订阅之前要等待的邮件数。
    /// </summary>
    /// <remarks>
    /// 如果未设置，则将接收所有已发布的消息,直到取消订阅或释放。
    /// </remarks>
    public int? MaxMsgs { get; init; }

    /// <summary>
    /// 在自动取消订阅之前等待的时间。
    /// </summary>
    /// <remarks>
    /// 如果未设置，则将接收所有已发布的消息,直到取消订阅或释放。
    /// </remarks>
    public TimeSpan? Timeout { get; init; }

    /// <summary>
    /// 接收到第一条消息之前允许的最长时间。如果超过，订阅将自动取消订阅。
    /// </summary>
    /// <remarks>
    /// 如果未设置，则将接收所有已发布的消息,直到取消订阅或释放。
    /// </remarks>
    public TimeSpan? StartUpTimeout { get; init; }

    /// <summary>
    /// 任意两条后续消息之间允许的最长时间,然后自动取消订阅。
    /// </summary>   
    /// <remarks>
    /// 如果未设置，则将接收所有已发布的消息,直到取消订阅或释放。
    /// </remarks>
    public TimeSpan? IdleTimeout { get; init; }

    /// <summary>
    /// 通道的最大容量。如果未指定，则使用默认值1000。
    /// </summary>
    public int? ChannelCapacity { get; init; }

    /// <summary>
    /// 达到容量时订阅频道的行为。
    /// /默认情况下，行为为<seealso cref="BoundedChannelFullMode.Wait"/>
    /// </summary>
    public BoundedChannelFullMode? ChannelFullMode { get; init; }
}
